/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.sgbl.dao;

import br.com.sgbl.bean.Estoque;
import br.com.sgbl.bean.Produto;
import br.com.sgbl.bean.TipoEmbalagem;
import br.com.sgbl.utils.Conexao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author heidi
 */
public class EstoqueDao {

    private static final String SQL_LISTAR =
            "SELECT * FROM estoque order by id";
    private static final String SQL_INSERIR =
            "INSERT INTO estoque (id, saldo, fk_produto_id, fk_tipo_embalagem_id) VALUES (?,?,?,?)";
    private static final String SQL_ALTERAR =
            "UPDATE estoque SET saldo = ?, fk_produto_id = ?, fk_tipo_embalagem_id = ? WHERE id = ?";
    private static final String SQL_EXCLUIR =
            "DELETE FROM estoque WHERE id = ?";

    public Estoque localizar(Connection conn, long codigo) throws SQLException {
        PreparedStatement ps = conn.prepareStatement("SELECT * FROM estoque where id= ?");
        ps.setLong(1, codigo);

        ResultSet rs = ps.executeQuery();

        if (rs.first()) {
            Estoque estoque = new Estoque();
            estoque.setId(rs.getLong("id"));
            estoque.setSaldo(rs.getInt("saldo"));

            ProdutoDao produtoDao = new ProdutoDao();
            Produto produto = produtoDao.localizar(conn, rs.getLong("fk_produto_id"));
            estoque.setProduto(produto);


            TipoEmbalagemDao tipoEmbalagemDao = new TipoEmbalagemDao();
            TipoEmbalagem tipoEmbalagem = tipoEmbalagemDao.localizar(conn, rs.getLong("fk_tipo_embalagem_id"));
            estoque.setTipoEmbalagem(tipoEmbalagem);

            return estoque;
        } else {
            return null;
        }
    }
    
    public Boolean verificaProduto(Connection conn, Estoque estoque) throws SQLException {
        PreparedStatement ps = conn.prepareStatement("SELECT * FROM estoque where fk_produto_id=?");
        ps.setLong(1, estoque.getProduto().getId());
        ResultSet rs = ps.executeQuery();
        
        return (rs.first());

    }

    public Estoque salvar(Estoque estoque) throws SQLException, Exception {
        if (estoque.getId() == 0) {
            return inserir(estoque);
        } else {
            return alterar(estoque);
        }
    }

    private Estoque inserir(Estoque estoque) throws SQLException, Exception {
        Connection conn = Conexao.getConnection();

        if(verificaProduto(conn, estoque)) {
            throw new Exception("Atenção, já existe uma estoque para este produto: " + estoque.getProduto().getDescricao());
        }
        try {
            PreparedStatement ps = conn.prepareStatement(SQL_INSERIR,
                    PreparedStatement.RETURN_GENERATED_KEYS);

            ps.setNull(1, Types.NULL);
            ps.setInt(2, estoque.getSaldo());
            ps.setLong(3, estoque.getProduto().getId());
            ps.setLong(4, estoque.getTipoEmbalagem().getId());

            ps.executeUpdate();

            ResultSet rs = ps.getGeneratedKeys();
            rs.first();

            estoque.setId(rs.getLong("GENERATED_KEY"));

            conn.commit();
        } finally {
            conn.close();
        }

        return estoque;
    }

    private Estoque alterar(Estoque estoque) throws SQLException {
        Connection conn = Conexao.getConnection();

        try {
            PreparedStatement ps = conn.prepareStatement(SQL_ALTERAR);

            ps.setInt(1, estoque.getSaldo());
            ps.setLong(2, estoque.getProduto().getId());
            ps.setLong(3, estoque.getTipoEmbalagem().getId());
            ps.setLong(4, estoque.getId());


            ps.executeUpdate();

            conn.commit();
        } finally {
            conn.close();
        }

        return estoque;
    }

    public List listar() throws SQLException {
        List lista = new ArrayList();

        Connection conn = Conexao.getConnection();

        try {
            PreparedStatement ps = conn.prepareStatement(SQL_LISTAR);

            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                Estoque estoque = new Estoque();

                estoque.setId(rs.getLong("id"));
                estoque.setSaldo(rs.getInt("saldo"));

                ProdutoDao produtoDao = new ProdutoDao();
                Produto produto = produtoDao.localizar(conn, rs.getLong("fk_produto_id"));
                estoque.setProduto(produto);


                TipoEmbalagemDao tipoEmbalagemDao = new TipoEmbalagemDao();
                TipoEmbalagem tipoEmbalagem = tipoEmbalagemDao.localizar(conn, rs.getLong("fk_tipo_embalagem_id"));
                estoque.setTipoEmbalagem(tipoEmbalagem);

                lista.add(estoque);
            }
        } finally {
            conn.close();
        }
        return lista;
    }

    public void excluir(Estoque estoque) throws SQLException {
        Connection conn = Conexao.getConnection();

        try {
            PreparedStatement ps = conn.prepareStatement(SQL_EXCLUIR);

            ps.setLong(1, estoque.getId());

            ps.executeUpdate();

            conn.commit();
        } finally {
            conn.close();
        }
    }
}
